home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / oh!.2hd / OH!DEN_B.LZH / TOOLS / CDC / CDCSRC.LZH / CDRC_.C < prev    next >
Text File  |  1995-03-20  |  24KB  |  1,091 lines

  1. #define        TrkMax 400
  2. #include    "_TNB.c"
  3. #define        UNchar        unsigned char
  4. #define        UNint        unsigned int
  5. extern    short    SCSI_ID;
  6. extern    short    LEDVMOD;
  7. extern    short    AutoMode;    // 0:ノーマル 1:オート(含loop)
  8. extern    short    RndMode;    // 0:ノーマル 1:ランダム
  9. extern    short    ReptMode;    // 0:ノーマル 1:リピート
  10. extern    short    MemMode;    // 0:ノーマル 1:メモリー
  11.  
  12. extern    short    MemLong;    // メモリながさ 0以外ならMEMORY
  13. extern    short    MemPt;        // メモリポインタ
  14. extern    UNchar    MemSock[];    // メモリ
  15. extern    short    RndLong;    // ランダムテーブルながさ 0以外ならMEMORY
  16. extern    short    RndPt;        // ランダムポインタ
  17. extern    UNchar    RndSock[];    // ランダムテーブル
  18. extern    short    TrkNo;        // 演奏中 トラックナンバー/メモリポインタ
  19. extern    short    TrkNoS;        // 演奏中 トラックナンバー/メモリポインタ
  20. extern    short    PauseMode;    // 0:特に 1:ポーズ中
  21. extern    short    ExTrak;        // 1;拡張トラックあり
  22.  
  23. extern    char    LEDBUF[8][16];    //テキスト表示用のパターンバンク
  24. extern    char    NAMEBUF[40][16];//表示幅は 36
  25. extern    char    CHARBUF[40];    //LEDに表示されている文字列
  26.  
  27. extern    short    CDIN;        //0:CDは入っていない 1:入っている
  28. extern    int    CdListS;    //CDLISTにあるなら 1 
  29. extern    int    CdTrak;        // 
  30. extern    int    CdLong;        // 長さ
  31. extern    char    CdName[40];    // CD名
  32. extern    int    ListStTm[TrkMax];    // スタート時間
  33. extern    int    ListLong[TrkMax];    // ながさ時間
  34. extern    char    ListName[TrkMax][40];    // 名前
  35.  
  36. extern    int    O_CdTrak;        // 
  37. extern    int    O_ListStTm[100];    // スタート時間
  38. extern    int    O_ListLong[100];    // ながさ時間
  39. extern    UNchar    O_ListTrak[100];    //
  40.  
  41. extern    short    CddevSw;        //0: SCSI直接 1:計測IOCTRL
  42. extern    short    CddDrvNo;        //計測IOCTRL用ドライヴNO
  43.  
  44. extern UNchar *SetNameAdd;
  45. /********************
  46.     常駐部
  47. *********************/
  48. /*------------------------------*/
  49. /*    構造体            */
  50. /*------------------------------*/
  51. typedef struct {
  52.     int    fg;            /* 状態 0x11 演奏中,0x12 演奏中断 */
  53.     int    track_no;        /* 曲番号 */
  54.     int    time;            /* 現在の演奏時間 */
  55.     int    address;        /* 演奏アドレス */
  56.     int    track_long;        /* 演奏中の曲のながさ*/
  57. } PLYINF;
  58. extern    PLYINF plyinf;
  59.  
  60. #define    min    1
  61. #define    max    CdTrak
  62.  
  63. static    int    CdPlayEndAdds;
  64.  
  65. /*----------------------------------------------------------------------------
  66.             演奏ルーチン
  67. ----------------------------------------------------------------------------*/
  68. /**************************************
  69.     一曲だけ演奏する。
  70.     [何番演奏する]
  71.         start=
  72.             Track No
  73.             0x100越の場合 MSF指定になる
  74.         end=
  75.             Track No
  76.             -1の場合 max に
  77.              0の場合 startのトラックの最後まで指定
  78.             0x100越の場合 MSF指定になる
  79. [戻り値] マイナス:エラー
  80. ****************************************/
  81. int    CdPlay( int start, int end )
  82. {
  83. int    start_address,leadout_address;
  84. int    end_address;
  85. int    i;
  86. leadout_address=CdLong;
  87. CdPlayEndAdds=end;
  88. if ( start<0x100 && (start<min || start>max) ){
  89.     TrkNo=0;
  90.     StpDsk();
  91.     //fprintf_(1,"指定された曲番号は、存在しません。\n");
  92.     return(-4);
  93. }
  94. if ( end<0 )
  95.     end = max;
  96. if ( end>0 && end<0x100 && (end<min || end>max) ){
  97.     TrkNo=0;
  98.     StpDsk();
  99.     //fprintf_(1,"指定された曲番号は、存在しません。\n");
  100.     return(-4);
  101. }
  102. if ( start<0x100 ){
  103.     start_address = ListStTm[start];    // スタート時間
  104.     if ( ((UNint)start_address&(UNint)0x80000000)==0 ){
  105.         ;
  106.     } else if ( CdPlayEndAdds<0 && start==1 && max!=1 ){
  107.         i=CdPlay( 2,-1);    //MD Towns CD 対策
  108.         if ( i==0 ) i=1;
  109.         return( i );
  110.     } else {
  111.         TrkNo=0;
  112.         StpDsk();
  113.         //fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error\n");
  114.         return(-2);
  115.     }
  116.     plyinf.address=start_address;    /* 演奏アドレス */
  117.     plyinf.track_no=start;        /* 曲番号 */
  118.     plyinf.time=0;            /* 現在の演奏時間 */
  119. } else {
  120.     start_address = start;
  121.     ChkPlyDispA(start_address);
  122. }
  123. if ( end==0 ){
  124.     if ( plyinf.track_no==max )
  125.         end_address = subtime(leadout_address,1);
  126.     else    end_address = subtime(ListStTm[plyinf.track_no+1],1);
  127. } else if ( end<0x100 ){
  128.     if ( end==max )
  129.         end_address = subtime(leadout_address,1);
  130.     else    end_address = subtime(ListStTm[end+1],1);
  131. } else {
  132.     end_address=end;
  133. }
  134. TrkNo=0;
  135. /* 演奏開始 */
  136. if ( PlyDsk( start_address, end_address ) != 0 ){
  137.     TrkNo=0;
  138.     StpDsk();
  139.     //fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error\n");
  140.     return(-2);
  141. }
  142. plyinf.fg=0x11;            /* 状態 0x11 演奏中,0x12 演奏中断 */
  143. TrkNo=plyinf.track_no;
  144. TrkNoS=TrkNo;
  145. SetTrkLong();
  146. WaitCC2();
  147. return(0);
  148. }
  149. /**************************************
  150.     全曲を演奏する
  151. [戻り値] マイナス:エラー
  152. **************************************/
  153. int    CdPlay_all( void )
  154. {
  155. int    start_address,leadout_address;
  156. TrkNo=0;
  157. start_address = ListStTm[min];
  158. leadout_address = subtime(CdLong,1);
  159. CdPlayEndAdds=-1;
  160. if ( ((UNint)start_address&(UNint)0x80000000)==0 ){
  161.     if( PlyDsk(start_address,leadout_address) != 0 ){ /* 演奏開始 */
  162.         TrkNo=0;
  163.         StpDsk();
  164.         //fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error");
  165.         return(-2);
  166.     }
  167.     plyinf.fg=0x11;            /* 状態 0x11 演奏中,0x12 演奏中断 */
  168.     plyinf.track_no=min;        /* 曲番号 */
  169.     plyinf.time=0;            /* 現在の演奏時間 */
  170.     plyinf.address=start_address;    /* 演奏アドレス */
  171.     TrkNo=min;
  172.     TrkNoS=TrkNo;
  173.     SetTrkLong();
  174.     WaitCC2();
  175.     return(0);
  176. } else if ( min!=max ) {
  177.     return( CdPlay( min+1,-1) );    //MD Towns CD 対策
  178. } else {
  179.     TrkNo=0;
  180.     StpDsk();
  181.     //fprintf_(1,"Play Audio Begin ・ Play Audio Block Count Command error");
  182.     return(-2);
  183. }
  184. return(0);
  185. }
  186. /*----------------------------------------------------------------------------
  187.             演奏補ルーチン
  188. ----------------------------------------------------------------------------*/
  189. /************************************
  190.       [UNDO] [R.UP][R.DN]
  191.     演奏を再開させる(曲単位)
  192. [引数] 現在からの±No ☆メモリ対応
  193. [戻り値] マイナス:エラー
  194. ************************************/
  195. int    CdPlay_restart( int no )
  196. {
  197. int    i,r;
  198. if ( TrkNo==0 )
  199.     return(-1);
  200. if ( RndMode ){
  201.     /*ランダムモード*/
  202.     if ( no==0 ){
  203.         i= TrkNo;
  204.         r=CdPlay( i,i );
  205.     } else {
  206.         if ( ++RndPt>=RndLong ){
  207.             r=CdPlay_Rnd2();
  208.         } else {
  209.             i=RndSock[RndPt];
  210.             r=CdPlay( i,i );
  211.         }
  212.         if ( r<0 ){
  213.             if ( ++RndPt>=RndLong ){
  214.                 r=CdPlay_Rnd2();
  215.             } else {
  216.                 i=RndSock[RndPt];
  217.                 r=CdPlay( i,i );
  218.             }
  219.         }
  220.         MemChkT();
  221.     }
  222.     return( r );
  223. }
  224. if ( MemLong==0 ){    /*メモリされていない*/
  225.     /* 最後まで演奏する */
  226.     i= TrkNo + no;
  227.     if ( i<min ) i=max;
  228.     if ( i>max ) i=min;
  229.     if ( ReptMode )
  230.         r=CdPlay( i,i );//ランダムならその曲のみ
  231.     else    r=CdPlay( i,-1 );
  232.     if ( r<0 ){
  233.         i+=no;
  234.         if ( i<min ) i=max;
  235.         if ( i>max ) i=min;
  236.         if ( ReptMode )
  237.             r=CdPlay( i,i );//ランダムならその曲のみ
  238.         else    r=CdPlay( i,-1 );
  239.     }
  240.     return( r );
  241. } else {
  242.     /*メモリされている*/
  243.     if ( no==0 ){
  244.         i= TrkNo;
  245.     } else {
  246.         i=MemPt+no;
  247.         if ( i<0 )     i=MemLong-1;
  248.         if ( i>=MemLong ) i=0;
  249.         MemPt=i;
  250.         i=MemSock[i];
  251.     }
  252.     r=CdPlay( i,i );
  253.     return( r );
  254. }
  255. return(-1);
  256. }
  257. /********************************
  258.     シーク処理(値を戻すだけ)
  259. [引数] 現在からの巻き戻し(-1)早送り(+1)
  260. [戻り値] 目的MSF
  261.     0なら動けない
  262. ********************************/
  263. int    SeekDisp(int no)
  264. {
  265. extern    short    TsekSw;
  266. int    i,l;
  267. extern    int    SeekNow;    //*
  268. extern    short    SeekNowTk;    //*_SeekNow補佐 trakno
  269. if ( TrkNo==0 || no==0 )
  270.     return(0);
  271. if ( SeekNow<0 ){
  272.     /* 初めてのコール*/
  273.     SeekNow=plyinf.time;
  274.     SeekNowTk=plyinf.track_no;
  275. }
  276. if ( TsekSw<30 )    l=22;    //0.3秒単位
  277. else if ( TsekSw<60 )    l=37;    //0.5秒単位
  278. else            l=0x100;//1.0秒単位
  279. if ( no<0 ){
  280.     i=SeekNow;
  281.     SeekNow=subtime(SeekNow,l);
  282.     if ( SeekNow>i || SeekNow<0 )
  283.         SeekNow=0;
  284. } else {
  285.     if ( SeekNow<=subtime(ListLong[SeekNowTk],0x200) )
  286.         SeekNow=addtime(SeekNow,l);
  287.     else    SeekNow=subtime(ListLong[SeekNowTk],0x100);
  288. }
  289. return( SeekNow+1 );
  290. }
  291.  
  292. #if 0
  293. /********************************
  294.     スキャン処理        (注)ベンダコールのため使えず(シクシーク)
  295. [引数] 現在からの±No
  296. [戻り値] マイナス:エラー
  297. ********************************/
  298. int    ScanDisp(int no)
  299. {
  300. int    i,r;
  301. if ( no==0 ) return(-1);
  302. i= plyinf.fg;
  303. if( i==0x11 ){
  304.     /* 演奏中 */
  305.     if ( no<0 )    r=Scan( 0x10 ,plyinf.time);    //no==0;早 0x10;巻き
  306.     else        r=Scan( 0x00 ,plyinf.time);    //no==0;早 0x10;巻き
  307.     return( r );
  308. }
  309. return(-1);
  310. }
  311. /********/
  312. int Scan( int no ,int start)    //no==0;早 0x10;巻き
  313. {
  314. /* Play Audio MSF  Command */
  315. unsigned char buf[16];
  316. buf[0] = 0xCD;                /* Play Audio MSF Command */
  317. buf[1]=no;
  318. buf[2]=0;
  319. buf[3] = ( start / 0x10000 ) & 0xff;
  320. buf[4] = ( start / 0x100 ) & 0xff;
  321. buf[5] = start & 0xff;
  322. buf[6] = 0;
  323. buf[7] = 1;
  324. buf[8] = 0;
  325. buf[9] = 0b01000000;
  326. return( scsi_cmd( 10, buf, 0, buf ) );
  327. }
  328. #endif
  329. /*************************************************************
  330.     ChkPlyバッファー調整
  331. *************************************************************/
  332. void    ChkPlyDisp()
  333. {
  334. int    i,t,ad;
  335. t=(plyinf.track_no&0xFFFF);
  336. ad=plyinf.address;
  337. i=O_ListTrak[t];
  338. for(;i<=max;i++){
  339.     if ( ad<(ListStTm[i]&0xFFFFFF) )
  340.         break;
  341. }
  342. plyinf.track_no=i-1;
  343. plyinf.time=subtime(ad,ListStTm[i-1]);
  344. }
  345. /*++++++++*/
  346. void    ChkPlyDispA(int ad) //adのみから計算
  347. {
  348. int    i;
  349. plyinf.address=ad;
  350. for(i=min;i<=max;i++){
  351.     if ( ad<(ListStTm[i]&0xFFFFFF) )
  352.         break;
  353. }
  354. plyinf.track_no=i-1;
  355. plyinf.time=subtime(ad,ListStTm[i-1]);
  356. }
  357. /**********/
  358. void    SetTrkLong()
  359. {
  360. plyinf.track_long=ListLong[TrkNo];    // ながさ時間
  361. }
  362. /*************************************
  363.    演奏時間の計算
  364. **************************************/
  365. void    ProgTimeCalc(st)
  366. int    *st;
  367. {
  368. int    i,j;
  369. if ( TrkNo==0 ){
  370.     st[0]=st[1]=0;
  371. } else if ( ReptMode ){        // 0:ノーマル 1:リピート
  372.     st[0]=ListLong[TrkNo];        // 長さ
  373.     st[1]=0;
  374. } else if ( RndPt>=0 ){        // ランダムポインタ
  375.     st[0]=0;
  376.     for(i=0;i<RndPt;i++)
  377.         st[0]=addtime(st[0],ListLong[RndSock[i]]);
  378.     st[1]=st[0];
  379.     for(;i<RndLong;i++)
  380.         st[0]=addtime(st[0],ListLong[RndSock[i]]);
  381. } else if ( MemPt>=0 ){        // メモリポインタ
  382.     st[0]=0;
  383.     for(i=0;i<MemPt;i++)
  384.         st[0]=addtime(st[0],ListLong[MemSock[i]]);
  385.     st[1]=st[0];
  386.     for(;i<MemLong;i++)
  387.         st[0]=addtime(st[0],ListLong[MemSock[i]]);
  388. } else if ( CdPlayEndAdds<0 ){
  389.     st[0]=subtime(CdLong,ListStTm[1]);        // 長さ
  390.     st[1]=subtime(ListStTm[TrkNo],ListStTm[1]);
  391. } else {
  392.     st[0]=ListLong[TrkNo];        // 長さ
  393.     st[1]=0;
  394. }
  395. }
  396. /*************************************
  397.     時間 bcd 同志の引き算  t1-t2
  398. **************************************/
  399. int subtime( int t1,int t2 )
  400. {
  401. /*    00:mm:ss:xx 何分何秒何1/75秒    */
  402. int    t1m,t1s,t1u;
  403. int    t2m,t2s,t2u;
  404. t1m=(t1>>16) & 0xff;
  405. t1s=(t1>>8 ) & 0xff;
  406. t1u=(t1    ) & 0xff;
  407.  
  408. t2m=(t2>>16) & 0xff;
  409. t2s=(t2>>8 ) & 0xff;
  410. t2u=(t2    ) & 0xff;
  411.  
  412. if ( (t1u-=t2u)<0 ){
  413.     if ( (t1u+=75)<0 )
  414.         t1u+=75;
  415.     t2s++;    //秒のマイナス値を+1
  416. }
  417. if ( (t1s-=t2s)<0 ){
  418.     if ( (t1s+=60)<0 )
  419.         t1s+=60;
  420.     t2m++;    //分のマイナス値を+1
  421. }
  422. t1m-=t2m;    //ここでマイナス値はおかしいはずなのだ
  423. return( (t1m<<16)|(t1s<<8)|t1u );
  424. }
  425. /*************************************
  426.     時間 bcd 同志の足し算  t1+t2
  427. **************************************/
  428. int addtime( int t1,int t2 )
  429. {
  430. /*    00:mm:ss:xx 何分何秒何1/75秒    */
  431. int    t1m,t1s,t1u;
  432. int    t2m,t2s,t2u;
  433. t1m=(t1>>16) & 0xff;
  434. t1s=(t1>>8 ) & 0xff;
  435. t1u=(t1    ) & 0xff;
  436.  
  437. t2m=(t2>>16) & 0xff;
  438. t2s=(t2>>8 ) & 0xff;
  439. t2u=(t2    ) & 0xff;
  440.  
  441. if ( (t1u+=t2u)>=75 ){
  442.     t1u-=75;
  443.     t1s++;
  444. }
  445. if ( (t1s+=t2s)>=60 ){
  446.     t1s-=60;
  447.     t1m++;
  448. }
  449. t1m+=t2m;
  450. return( (t1m<<16)|(t1s<<8)|t1u );
  451. }
  452. /*----------------------------------------------------------------------------
  453.             タイトルルーチン
  454. ----------------------------------------------------------------------------*/
  455. /************************************************
  456.     引数により名前ポインタアドレス
  457. [戻り値] アドレス
  458. *************************************************/
  459. char    *NamePoint(kn,ofs)
  460. int    kn,ofs;
  461. {
  462. int    i,l;
  463. char    *s;
  464. if ( ((UNint)ListLong[kn]&(UNint)0x80000000)==0 )
  465.     return(ListName[kn]);
  466. //拡張曲名あり
  467. for(l=TrkMax-1;l>CdTrak;l--){
  468.     i=ListLong[l];
  469.     if ( (i&0xFF0000)==0xFF0000 ){
  470.         if ( (i&0xFF)==kn )
  471.             break;
  472.     }
  473. }
  474. if ( l<=CdTrak )
  475.     return(ListName[kn]);    //なぜか無い
  476. s=ListName[kn];
  477. for(;l>CdTrak;l--){
  478.     i=ListLong[l];
  479.     if ( (i&0xFF0000)!=0xFF0000 )
  480.         break;
  481.     if ( (i&0xFF)!=kn )
  482.         break;
  483.     if ( ofs>=(ListStTm[l]&0xFFFFFF) )
  484.         s=&ListName[l][2];
  485. }
  486. return(s);
  487. }
  488. /*************************************************************
  489.     LED表示文字列制作
  490. *************************************************************/
  491. #define jstrlen(SR)                                \
  492. ({     char *st_=(SR);    int l_=0,c_;                        \
  493.     while( c_=*(st_++) ){                            \
  494.         l_++;    if ( (c_>=0x80&&c_<=0x9f)||c_>=0xE0 ){ l_++; st_++; }    \
  495.     } (l_);                                    \
  496. })
  497. /*+++++++++*/
  498. void    SetNameLed(na)
  499. UNchar    *na;
  500. {
  501. int    i,l,c;
  502. UNchar    *ad=(void*)NAMEBUF;
  503. UNchar    *ac=(void*)CHARBUF;
  504. i=0;
  505. if ( SetNameAdd==na )    //既に書いた
  506.     return;
  507. FncBarC();
  508. SetNameAdd=na;
  509. if ( CdName[0]!=' ' ){    // CD名
  510.     l=jstrlen(na);
  511.     for(;i<(36-l)/2;i++,ad+=16){
  512.         SetSp(ad);
  513.         *ac++=0x20;
  514.     }
  515. }
  516. for(;i<40-1;i++,ad+=16){
  517.     c=(*ac++=*na++);
  518.     if ( c==0 )
  519.         break;
  520.     if ( (c>=0x80 && c<=0x9f) || c>=0xE0 ){
  521.         i++;
  522.         c=c*0x100+(*ac++=*na++);
  523.     }
  524.     if ( SetFont(ad,c)==2 )
  525.         ad+=16;
  526. }
  527. for(;i<40-1;i++,ad+=16)
  528.     SetSp(ad);
  529. }
  530. /*----------------------------------------------------------------------------
  531.             タイトルリスト解析ルーチン
  532. ----------------------------------------------------------------------------*/
  533. /************************************************
  534.     CDCLISTより、現在のCDちぇっっく
  535. [戻り値] 0 :
  536.     -1 : ERR!
  537. *************************************************/
  538. int    CdListSub()
  539. {
  540. int    leadout_address,min_,max_;
  541. int    i,l;
  542. int    start,end;
  543. int    lst[100];
  544. CdListS=0;    //CDLISTにあるなら 1 
  545. ExTrak=0;
  546. if ( CDROM_chk() ){
  547.     //fprintf_(1,"SCSI-ID=%2 の装置は、CD-ROM ではないようです。\r\n",SCSI_ID );
  548.     return(-100);
  549. }
  550. if( RedTOC(&leadout_address,&min_,&max_)!=0 ){
  551.     //fprintf_(1,"Leadout Track Address or ReadTOC Command error.\r\n");
  552.     return(-1);
  553. }
  554. end = leadout_address;
  555. /*はじめにチェック*/
  556. MemLong=0;        //メモリながさ
  557. CdLong=end;            // 長さ
  558. O_CdTrak=max_;
  559. CdTrak=max_;
  560. CdName[0]=0;
  561. if ( Music_inf_all( min_,max_,&lst ) ){
  562.     //fprintf_(1,"Start Track Address or ReadTOC Command error.\r\n");
  563.     return(-1);
  564. }
  565. for(l=min_;l<=max_;l++){
  566.     start=lst[l];
  567.     if( l==max_ ){
  568.         end = subtime( leadout_address,1 );
  569.     } else {
  570.         end=lst[l+1];
  571.         end = subtime( end,1 );
  572.     }
  573.     O_ListStTm[l]=start;
  574.     ListStTm[l]=start;
  575.     i= subtime( end,subtime( start,1 ) );
  576.     O_ListLong[l]=i;        // 長さ
  577.     ListLong[l]=i;        // 長さ
  578.     ListName[l][0]=0;
  579.     ListName[l][2]=0;
  580.     O_ListTrak[l]=l;    //
  581. }
  582. for(;l<100;l++){
  583.     ListName[l][0]=0;
  584.     ListName[l][2]=0;
  585.     ListLong[l]=0;
  586.     O_ListLong[l]=0;
  587. }
  588. for(;l<TrkMax;l++){
  589.     ListName[l][0]=0;
  590.     ListName[l][2]=0;
  591.     ListLong[l]=0;
  592. }
  593. O_ListTrak[max_+1]=max_+1;    //
  594. O_ListStTm[max_+1]=CdLong;
  595. //ListStTm[max_+1]=CdLong;
  596. SetNameAdd=0;
  597. return(0);
  598. }
  599. /***************/
  600. void    CdNameClr()
  601. {
  602. int    l;
  603. CdName[0]=0;
  604. for(l=0;l<TrkMax;l++){
  605.     ListName[l][0]=0;
  606.     ListName[l][2]=0;
  607.     (UNint)ListLong[l]&=(UNint)0x7FFFFFFF;    //拡張曲名fg
  608. }
  609. SetNameAdd=0;
  610. }
  611. /************************************************
  612.     CDCLISTより、現在のCDちぇっっく
  613.         先にCdListSub()を実行のこと
  614. [戻り値] 0 : OK、あった 設定した
  615.     -1 : ERR!  なかった
  616. *************************************************/
  617. int    CdListDisp(f)
  618. int    f;    //ファイルポインタ
  619. {
  620. int    l;
  621. if ( CdListDisp__(f) ){
  622.     NoTtlFile();
  623.     return(-1);
  624. }
  625. ListStTm[CdTrak+1]=CdLong;
  626. for(l=1;l<=CdTrak;l++){
  627.     (UNint)ListLong[l]&=(UNint)0xFF000000;
  628.     ListLong[l]|=subtime( ListStTm[l+1],ListStTm[l]);
  629. }
  630. return(0);
  631. }
  632. /*+++++++++++*/
  633. int    CdListDisp__(f)
  634. int    f;    //ファイルポインタ
  635. {
  636. int    leadout_address,min_,max_;
  637. int    i,j,l,tr;
  638. int    kcn;
  639. char    tnum[100];
  640. unsigned char *s,*d;
  641. if( RedTOC(&leadout_address,&min_,&max_)!=0 ){
  642.     //fprintf_(1,"Leadout Track Address or ReadTOC Command error.\r\n");
  643.     return(-1);
  644. }
  645. for(i=0;i<100;tnum[i++]=1);
  646. kcn=TrkMax-1;    //(l=TrkMax-1;kcn>CdTrak;kcn--){
  647. CdTrak=O_CdTrak;
  648.  
  649. for(;;){
  650.     if ( (int)(s=Fgets(f))<=0 ) return(-1);    //ファイルエンド
  651.  
  652.     //fprintf_(1,s);
  653.     //fprintf_(1,"\r\n");
  654.  
  655.     //まずは'    All ('探し
  656.     if ( s[4]=='A' && s[5]=='l' && s[6]=='l' && s[8]=='('){
  657.         ;
  658.     } else    continue;
  659.     i=(s[ 9]-'0')*0x10000*10+
  660.       (s[10]-'0')*0x10000    +
  661.       (s[12]-'0')*0x100  *10+
  662.       (s[13]-'0')*0x100    +
  663.       (s[15]-'0')         *10+
  664.       (s[16]-'0');
  665.  
  666.     if ( CdLong!=i ) continue;    //違う
  667.     s=&s[17];
  668.     for(;*s!=9;s++);
  669.     for(;*s==9;s++);
  670.     d=CdName;
  671.     for(i=0;i<40-2;i++){
  672.         if ( (j=(*d++=*s++))==0 )
  673.             break;
  674.         if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
  675.             *d++=*s++;
  676.             i++;
  677.         }
  678.     }
  679.     for(;i<40;i++)
  680.         *d++=0;
  681.  
  682.     //fprintf_(1,CdName);
  683.     //fprintf_(1,"\r\n");
  684.  
  685.     if ( (int)(s=Fgets(f))<=0 ) return(-1);    //ファイルエンド
  686.         //1行空のはず
  687.  
  688.     for(tr=l=min_;l<=max_+1;l++,tr++){
  689.  
  690.         if ( (int)(s=Fgets(f))<=0 ) return(-1);    //ファイルエンド
  691.  
  692.         //fprintf_(1,s);
  693.         //fprintf_(1,"\r\n");
  694.  
  695.         //中間曲名
  696.         if ( s[0]==9 && s[1]=='(' && s[2]=='*' && s[3]==')' ){
  697.             if ( kcn<=tr ){
  698.                 return(-1);    //多すぎ
  699.             }
  700.             l--;
  701.             tr--;
  702.             i=(s[ 4]-'0')*0x10000*10+
  703.               (s[ 5]-'0')*0x10000    +
  704.               (s[ 7]-'0')*0x100  *10+
  705.               (s[ 8]-'0')*0x100    +
  706.               (s[10]-'0')         *10+
  707.               (s[11]-'0');
  708.             (UNint)ListLong[tr]|=(UNint)0x80000000;    //拡張曲名fg
  709.             ListLong[kcn]=0xFF0000+(tr);
  710.             ListStTm[kcn]=i;
  711.             s=&s[12];
  712.             for(;*s!=9;s++);
  713.             for(;*s==9;s++);
  714.             d=ListName[kcn];
  715.             *d++=0;
  716.             *d++=0;
  717.             for(i=2;i<40-2;i++){
  718.                 if ( (j=(*d++=*s++))==0 )
  719.                     break;
  720.                 if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
  721.                     *d++=*s++;
  722.                     i++;
  723.                 }
  724.             }
  725.             for(;i<40;i++)
  726.                 *d++=0;
  727.             kcn--;
  728.             continue;
  729.         }
  730.         //拡張曲名
  731.         if ( s[0]==' ' && s[1]=='(' && s[4]==')' && s[5]==' ' ){
  732.             ExTrak=-1;
  733.             if ( kcn<=tr ){
  734.                 return(-1);    //多すぎ
  735.             }
  736.             //tr--;
  737.             CdTrak++;
  738.             l--;
  739.             i=(s[ 7]-'0')*0x10000*10+
  740.               (s[ 8]-'0')*0x10000    +
  741.               (s[10]-'0')*0x100  *10+
  742.               (s[11]-'0')*0x100    +
  743.               (s[13]-'0')         *10+
  744.               (s[14]-'0');
  745.             //ListLong[tr]=O_ListLong[l];
  746.             ListStTm[tr]=addtime(O_ListStTm[l],i);
  747.             tnum[l]++;
  748.             s=&s[15];
  749.             for(;*s!=9;s++);
  750.             for(;*s==9;s++);
  751.             d=ListName[tr];
  752.             for(i=0;i<40-2;i++){
  753.                 if ( (j=(*d++=*s++))==0 )
  754.                     break;
  755.                 if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
  756.                     *d++=*s++;
  757.                     i++;
  758.                 }
  759.             }
  760.             for(;i<40;i++)
  761.                 *d++=0;
  762.             continue;
  763.         }
  764.  
  765.         if ( l>max_ ){
  766.             l++;
  767.             break;
  768.         }
  769.         i=(s[ 7]-'0')*0x10000*10+
  770.           (s[ 8]-'0')*0x10000    +
  771.           (s[10]-'0')*0x100  *10+
  772.           (s[11]-'0')*0x100    +
  773.           (s[13]-'0')         *10+
  774.           (s[14]-'0');
  775.         if ( O_ListLong[l]!=i )
  776.             break;    //違う
  777.         ListStTm[tr] = O_ListStTm[l];
  778.         //ListLong[tr] = O_ListLong[l];    /**/
  779.         O_ListTrak[l]=tr;    //
  780.         s=&s[15];
  781.         for(;*s!=9;s++);
  782.         for(;*s==9;s++);
  783.         d=ListName[tr];
  784.         for(i=0;i<40-2;i++){
  785.             if ( (j=(*d++=*s++))==0 )
  786.                 break;
  787.             if ( (j>=0x80 && j<=0x9f) || j>=0xE0 ){
  788.                 *d++=*s++;
  789.                 i++;
  790.             }
  791.         }
  792.         for(;i<40;i++)
  793.             *d++=0;
  794.  
  795.         //fprintf_(1,ListName[tr]);
  796.         //fprintf_(1,"\r\n");
  797.     }
  798.     if ( l<=max_+1 )
  799.         ;
  800.     else break;
  801. }
  802. CdListS=1;    //CDLISTにあるなら 1 
  803. /*プログラムはある?*/
  804. if ( s[0]=='\t' && s[1]=='<' ){    //既に読んでいる
  805.     s+=2;
  806.     for(MemLong=0;MemLong<100;){
  807.         for(;*s==' ';s++);
  808.         i=c_atoi(s,&j);
  809.         s+=j;
  810.         if ( i<1 || i>99 )
  811.             break;
  812.         MemSock[MemLong]=O_ListTrak[i];
  813.         if ( *s=='.' ){
  814.             s++;
  815.             i=c_atoi(s,&j);
  816.             s+=j;
  817.             if ( i>=0 && i<=9 )
  818.                 MemSock[MemLong]+=i;
  819.         } else if ( *s=='a' || *s=='A' ){
  820.             s++;
  821.             for(j=1;j<tnum[i];j++)
  822.                 MemSock[++MemLong]=O_ListTrak[i]+j;
  823.         }
  824.         MemLong++;
  825.         for(;*s==' ';s++);
  826.         if ( *s=='>' ) break;
  827.         s++;
  828.     }
  829.     if ( *s!='>' ) MemLong=0;
  830. }
  831. return(0);
  832. }
  833. /*****************************
  834.     タイトルリストに無し
  835.     タイトルリスト無し
  836. *****************************/
  837. void    NoTtlFile()
  838. {
  839. int    l;
  840. for(l=1;l<=O_CdTrak;l++){
  841.     ListStTm[l]=O_ListStTm[l];
  842.     ListLong[l]=O_ListLong[l];        // 長さ
  843.     O_ListTrak[l]=l;
  844. }
  845. CdTrak=O_CdTrak;
  846. ExTrak=0;
  847. }
  848. /******************************
  849.     文字列を数字に
  850. ******************************/
  851. int    c_atoi(m,n)
  852. UNchar    *m;
  853. int    *n;
  854. {
  855. int    i=0,j=0;
  856. for(;;){
  857.     if ( *m<(UNchar)'0' || *m>(UNchar)'9' )
  858.         break;
  859.     i=i*10+*m-'0';    j++;    m++;
  860. }
  861. *n=j;        /*うごいたかず!!*/
  862. return(i);
  863. }
  864.  
  865. /*----------------------------------------------------------------------------
  866.             危険割り込みルーチン
  867.                 使用順
  868. ----------------------------------------------------------------------------*/
  869. /************************************
  870.          BGM
  871.     {演奏していないなら演奏}
  872. ************************************/
  873. void    CdPlay_Bgm()
  874. {
  875. extern    int    BgmStAdds,BgmEdAdds;
  876. if ( CDIN==0 ){
  877.     B_KLE_D2();
  878.     return;
  879. }
  880. if ( TrkNo==0 )
  881.     CdPlay(BgmStAdds,BgmEdAdds);
  882. B_KLE_D2();
  883. return;
  884. }
  885. /************************************
  886.          リピート(1P)
  887.     {演奏していないなら演奏}
  888.     {違うトラックなら演奏}
  889. ************************************/
  890. void    CdPlay_Rept()
  891. {
  892. if ( CDIN==0 ){
  893.     B_KLE_D2();
  894.     return;
  895. }
  896. if ( TrkNo==0 ){
  897.     CdPlay(TrkNoS,TrkNoS);
  898. } else if ( plyinf.track_no!=TrkNoS ){
  899.     CdPlay(TrkNoS,TrkNoS);
  900. }
  901. B_KLE_D2();
  902. return;
  903. }
  904. /************************************
  905.          ランダム
  906.     演奏していないなら演奏
  907. ************************************/
  908. void    CdPlay_Rnd()
  909. {
  910. int    i,j,r;
  911. if ( CDIN==0 ){
  912.     B_KLE_D2();
  913.     return;
  914. }
  915. if ( TrkNo!=0 ){    //演奏している
  916.     B_KLE_D2();
  917.     return;
  918. }
  919. if ( RndPt<0 ){
  920.     CdPlay_Rnd2();
  921. } else if ( ++RndPt>=RndLong ){
  922.     if ( AutoMode==0 ){    // 0:ノーマル 1:オート
  923.         TrkNo=0;
  924.         TrkNoS=0;
  925.         RndPt--;    //演奏ストップ
  926.         RndMode=0;    // 0:ノーマル 1:ランダム
  927.         B_KLE_D2();
  928.         return;
  929.     } else {
  930.         CdPlay_Rnd2();
  931.     }
  932. } else {
  933.     i=RndSock[RndPt];
  934.     r=CdPlay( i,i );
  935. }
  936. MemChkT();
  937. B_KLE_D2();
  938. return;
  939. }
  940. /*++++++++++++++*/
  941. int    CdPlay_Rnd2()
  942. {
  943. int    i,h,r,l,j;
  944. if ( CDIN==0 )
  945.     return(-1);
  946. if ( MemLong==0 ){
  947.     for(i=0;i<max;i++)
  948.         RndSock[i]=i+1;    // ランダムテーブル
  949.     RndLong=max;
  950. } else {
  951.     for(i=0;i<MemLong;i++)
  952.         RndSock[i]=MemSock[i];    // ランダムテーブル
  953.     RndLong=MemLong;
  954. }
  955. Randomize(*(short*)(0x09CC));
  956. for(i=0;i<100;i++){
  957.     h=MODU(Rand(),RndLong);
  958.     l=MODU(Rand(),RndLong);
  959.     if ( l==h )
  960.         l=MODU(Rand(),RndLong);
  961.     j=RndSock[h];
  962.     RndSock[h]=RndSock[l];
  963.     RndSock[l]=j;
  964. }
  965. if ( TrkNoS==RndSock[0] ){
  966.     j=RndSock[0];
  967.     RndSock[0]=RndSock[RndLong-1];
  968.     RndSock[RndLong-1]=j;
  969. }
  970. RndPt=0;
  971. i=RndSock[RndPt];
  972. r=CdPlay( i,i );
  973. return(r);
  974. }
  975. /************************************
  976.          メモリー
  977.     (メモリー+AUTO)
  978.     {演奏していないなら演奏}
  979. ************************************/
  980. void    CdPlay_Mem()
  981. {
  982. int    i,r;
  983. if ( CDIN==0 ){
  984.     B_KLE_D2();
  985.     return;
  986. }
  987. if ( TrkNo!=0 ){    //演奏している
  988.     B_KLE_D2();
  989.     return;
  990. }
  991. if ( ++MemPt>=MemLong ){
  992.     if ( AutoMode==0 ){    // 0:ノーマル 1:オート
  993.         TrkNo=0;
  994.         TrkNoS=0;
  995.         MemMode=0;    // 0:ノーマル 1:メモリー
  996.         MemPt--;    //演奏ストップ
  997.         B_KLE_D2();
  998.         return;
  999.     } else {
  1000.         MemPt=0;
  1001.     }
  1002. }
  1003. i=MemSock[MemPt];
  1004. r=CdPlay( i,i );
  1005. B_KLE_D2();
  1006. return;
  1007. }
  1008. /*++++++++++++++*/
  1009. void    MemChkT()
  1010. {
  1011. int    i;
  1012. if ( TrkNo==0 ){
  1013.     MemPt=-1;
  1014.     return;
  1015. }
  1016. for(i=0;i<MemLong;i++)
  1017.     if ( TrkNo==MemSock[i] )
  1018.         break;
  1019. if ( i<MemLong )
  1020.     MemPt=i;
  1021.  else    MemPt=-1;
  1022. }
  1023. /************************************
  1024.        オート[*]
  1025.     {演奏していないなら演奏}
  1026.     {TrkNoもちがうなら更新する}
  1027. ************************************/
  1028. void    CdPlay_Auto()
  1029. {
  1030. int    i;
  1031. if ( CDIN==0 ){
  1032.     B_KLE_D2();
  1033.     return;
  1034. }
  1035. if ( TrkNo!=0 && plyinf.track_no!=TrkNo ){
  1036.     TrkNo=plyinf.track_no;
  1037.     TrkNoS=TrkNo;
  1038.     SetTrkLong();
  1039.     MemChkT();
  1040. }
  1041. if ( MemLong!=0 ){
  1042.     MemMode=-1;    // 0:ノーマル 1:メモリー
  1043.     CdPlay_Mem();
  1044.     return;
  1045. }
  1046. if ( TrkNo==0 ){
  1047.     if ( TrkNoS>=max )
  1048.         CdPlay_all();
  1049.     else    CdPlay(TrkNoS+1,-1);
  1050. }
  1051. B_KLE_D2();
  1052. return;
  1053. }
  1054. /************************************
  1055.      ノーマルCDチェック
  1056.     {TrkNoもちがうなら更新する}
  1057. ************************************/
  1058. void    CdPlay___()
  1059. {
  1060. if ( CDIN==0 ){
  1061.     B_KLE_D2();
  1062.     return;
  1063. }
  1064. if ( TrkNo==0 ){
  1065.     #if 0
  1066.     if ( TrkNoS!=0 ){
  1067.         if ( TrkNoS>=max ){
  1068.             TrkNoS=0;
  1069.         } else {
  1070.             if ( MemLong!=0 ){
  1071.                 MemMode=-1;    // 0:ノーマル 1:メモリー
  1072.                 CdPlay_Mem();
  1073.                 return;
  1074.             }
  1075.             CdPlay(TrkNoS+1,-1);
  1076.         }
  1077.     }
  1078.     #endif
  1079.     B_KLE_D2();
  1080.     return;
  1081. }
  1082. if ( plyinf.track_no!=TrkNo ){
  1083.     TrkNo=plyinf.track_no;
  1084.     TrkNoS=TrkNo;
  1085.     SetTrkLong();
  1086.     MemChkT();
  1087. }
  1088. B_KLE_D2();
  1089. return;
  1090. }
  1091.